﻿

#include "zyListBox.h"


DarkMoonUI::zyListBox::zyListBox()
{
	SetMember(L"this", (LONG_PTR)this);
	m_obj->setChildWndProc(zyListBox_ChildWndProc);
}
DarkMoonUI::zyListBox::~zyListBox()
{

}
LRESULT WINAPI DarkMoonUI::zyListBox::zyListBox_ChildWndProc(zyObject* obj, HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam, BOOL* bHandle)
{
	if (message == WM_COMMAND)
	{
		short id = LOWORD(wParam);// & 65535); //LOWORD
		int code = HIWORD(wParam);
		if (code == LBN_SELCHANGE) {
			TRegEvent* evtPtr = (TRegEvent*)obj->getRegEvent(L"OnSelChange");
			if (evtPtr != nullptr) {
				evtPtr->handler<LRESULT>(lParam ,id);
			}
		}
		else if (code == LBN_DBLCLK) {
			TRegEvent* evtPtr = (TRegEvent*)obj->getRegEvent(L"OnItemDBClick");
			if (evtPtr != nullptr)
				evtPtr->handler<LRESULT>(lParam, id);
		}
		else if (code == LBN_SELCANCEL) {
			TRegEvent* evtPtr = (TRegEvent*)obj->getRegEvent(L"OnSelCancel");
			if (evtPtr != nullptr)
				evtPtr->handler<LRESULT>(lParam, id);
		}
	}
	return zyCommandCtrol::zyCommand_ChildWndProc(obj, hWnd, message, wParam, lParam, bHandle);
}

BOOL DarkMoonUI::zyListBox::创建(HWND 参数_父窗口, const std::wstring& 参数_标题, POINT 参数_位置, POINT 参数_尺寸, int 参数_ID, int 参数_窗口风格, int 参数_扩展风格)
{
	if (参数_窗口风格 == 0)
		参数_窗口风格 = LBS_USETABSTOPS | WS_VSCROLL | WS_TABSTOP | WS_HSCROLL | LBS_NOINTEGRALHEIGHT;
	if (参数_ID == NULL)
		参数_ID = 黑月默认ID();
	if (参数_扩展风格 == 0)
		参数_扩展风格 = WS_EX_CLIENTEDGE;
	return _CreateCtrol(参数_父窗口, 参数_标题, 参数_位置, 参数_尺寸, 参数_ID, 参数_窗口风格 | LBS_NOTIFY, 参数_扩展风格, L"Listbox");
}

BOOL DarkMoonUI::zyListBox::创建(zyWindow& 参数_父窗口, const std::wstring& 参数_标题, POINT 参数_位置, POINT 参数_尺寸, int 参数_ID, int 参数_窗口风格, int 参数_扩展风格)
{
	if (参数_窗口风格 == 0)
		参数_窗口风格 = LBS_USETABSTOPS | WS_VSCROLL | WS_TABSTOP | WS_HSCROLL | LBS_NOINTEGRALHEIGHT;
	if (参数_ID == NULL)
		参数_ID = 黑月默认ID();
	if (参数_扩展风格 == 0)
		参数_扩展风格 = WS_EX_CLIENTEDGE;
	return _CreateCtrol(参数_父窗口.getHwnd(), 参数_标题, 参数_位置, 参数_尺寸, 参数_ID, 参数_窗口风格 | LBS_NOTIFY, 参数_扩展风格, L"Listbox");
}
int DarkMoonUI::zyListBox::加入项目(const std::wstring& 参数_项目文本, int 参数_项目数值) {
	int 局部_索引 = (int)sendMsg(LB_ADDSTRING, 0, (LPARAM)参数_项目文本.c_str());
	if (局部_索引 != LB_ERR)
		sendMsg(LB_SETITEMDATA, 局部_索引, 参数_项目数值);
	return 局部_索引;
}
int DarkMoonUI::zyListBox::插入项目(const std::wstring& 参数_内容, int 参数_插入位置, int 参数_项目数值) {//插入指定项目到列表框的指定位置处，成功返回插入后该项目所处的位置，失败返回 -1 。
	int 局部_索引 = (int)sendMsg(LB_INSERTSTRING, 参数_插入位置, (LPARAM)参数_内容.c_str());
	if (局部_索引 != LB_ERR)
		sendMsg(LB_SETITEMDATA, 局部_索引, 参数_项目数值);
	return 局部_索引;
}
int DarkMoonUI::zyListBox::选择项目文本(const std::wstring& 参数_欲选择的项目文本, int 参数_起始索引) {
	return (int)sendMsg(LB_SELECTSTRING, 参数_起始索引, (LPARAM)参数_欲选择的项目文本.c_str());
}
bool DarkMoonUI::zyListBox::选择项目索引(int 参数_项目索引, bool 参数_是否选择) {
	int 局部_标志 = 参数_是否选择 ? 1 : 0;
	return sendMsg(LB_SETSEL, 局部_标志, 参数_项目索引) != LB_ERR;
}
bool DarkMoonUI::zyListBox::选择多项(int 参数_起始索引, int 参数_结束索引, bool 参数_是否选择) {
	int 局部_标志 = 参数_是否选择 ? 1 : 0;
	int 局部_范围 = MAKELPARAM(参数_起始索引, 参数_结束索引);
	return sendMsg(LB_SELITEMRANGE, 局部_标志, 局部_范围) != LB_ERR;
}
int DarkMoonUI::zyListBox::查找(const std::wstring& 参数_匹配文本, int 参数_起始索引) {//成功返回找到的索引，失败返回-1。忽略大小写
	return (int)sendMsg(LB_FINDSTRING, 参数_起始索引, (LPARAM)参数_匹配文本.c_str());
}
int DarkMoonUI::zyListBox::精确查找(const std::wstring& 参数_匹配文本, int 参数_起始索引) {//本操作必须整个字符串相同。如果找到则返回表项索引，否则返回-1。忽略大小写
	return (int)sendMsg(LB_FINDSTRINGEXACT, 参数_起始索引, (LPARAM)参数_匹配文本.c_str());
}
int DarkMoonUI::zyListBox::取现行选中项() {//本方法仅适用于单选择列表框。成功返回现行选中项索引，失败返回-1。
	return (int)sendMsg(LB_GETCURSEL, 0, 0);
}
int DarkMoonUI::zyListBox::置现行选中项(int 参数_项目索引) {//本方法仅适用于单选择列表框。失败返回-1，注意：参数"项目索引"为-1时，将始终返回-1。
	return (int)sendMsg(LB_SETCURSEL, 参数_项目索引, 0);
}
int DarkMoonUI::zyListBox::取项目数() {//成功返回项目总数。
	return (int)sendMsg(LB_GETCOUNT, 0, 0);
}
int DarkMoonUI::zyListBox::取项目数值(int 参数_项目索引) {//返回与指定项目相关联的数值。如果指定项目不存在，将返回 -1 。
	return (int)sendMsg(LB_GETITEMDATA, 参数_项目索引, 0);
}
bool DarkMoonUI::zyListBox::置项目数值(int 参数_项目索引, int 参数_数值) {//设置与指定项目相关联的数值。成功返回真，失败返回假。
	return sendMsg(LB_SETITEMDATA, 参数_项目索引, 参数_数值) != LB_ERR;
}
bool DarkMoonUI::zyListBox::是否被选择(int 参数_项目索引) {//如果指定项目被选择，则返回真，否则返回假。
	return sendMsg(LB_GETSEL, 参数_项目索引, 0) != 0;
}
int DarkMoonUI::zyListBox::取已选择项目数() {//本方法仅适用于多选择列表框才能成功，返回已被选择项目的数目。失败返回-1。
	return (int)sendMsg(LB_GETSELCOUNT, 0, 0);
}
int DarkMoonUI::zyListBox::取所有被选择项(std::vector<int>& 参数_索引数组) {//本方法仅适用于多选择列表框才能成功,返回被选择数目。失败返回-1。
	int 数量 = (int)sendMsg(LB_GETSELCOUNT, 0, 0);
	if (数量 <= 0)
		return 数量;
	参数_索引数组.resize(数量);
	sendMsg(LB_GETSELITEMS, 数量, (LPARAM)&参数_索引数组[0]);
	return 数量;
}
std::wstring DarkMoonUI::zyListBox::取项目文本(int 参数_项目索引) {//返回指定项目的文本。如果指定项目不存在，将返回空文本。
	int 局部_长度 = (int)sendMsg(LB_GETTEXTLEN, 参数_项目索引, 0) * 2 + 2;
	std::wstring txt;
	txt.reserve(局部_长度);
	sendMsg(LB_GETTEXT, 参数_项目索引, (LPARAM)txt.c_str());
	return txt;
}
int DarkMoonUI::zyListBox::取顶端可见项() {//成功返回顶端可见项目的索引，索引从0开始。失败返回-1。
	return (int)sendMsg(LB_GETTOPINDEX, 0, 0);
}
bool DarkMoonUI::zyListBox::置顶端可见项(int 参数_项目索引) {//设置列表框中当前最顶端的可见项目，必要时将自动滚动列表框。成功返回真，失败返回假。
	return sendMsg(LB_SETTOPINDEX, 参数_项目索引, 0) != LB_ERR;
}
int DarkMoonUI::zyListBox::取焦点项目() {//成功返回当前焦点项目的位置索引。如果在单选列表框中使用本命令，将返回当前被选择项目的位置索引。失败返回-1。
	return (int)sendMsg(LB_GETCARETINDEX, 0, 0);
}
bool DarkMoonUI::zyListBox::置焦点项目(int 参数_项目索引) {//本命令仅在多选列表框中使用，用作设置当前焦点项目。如果在单选列表框中使用本命令，将设置当前被选择项目。成功返回真，失败返回假。
	return sendMsg(LB_SETCARETINDEX, 参数_项目索引, 0) != LB_ERR;
}
int DarkMoonUI::zyListBox::取项目高度() {//返回项目高度。
	return (int)sendMsg(LB_GETITEMHEIGHT, -1, 0);
}
RECT DarkMoonUI::zyListBox::取项目矩形(int 参数_项目索引) {
	RECT 局部_矩形 = { 0 };
	sendMsg(LB_GETITEMRECT, 参数_项目索引, (LPARAM)&局部_矩形);
	return 局部_矩形;
}
bool DarkMoonUI::zyListBox::置项目高度(int 参数_高度) {//成功返回真，失败返回假。
	int 返回值 = (int)sendMsg(LB_SETITEMHEIGHT, -1, 参数_高度);
	重画();
	return 返回值 != LB_ERR;
}
bool DarkMoonUI::zyListBox::置列宽度(int 参数_列宽度) {//本方法仅在多选列表框中使用。成功返回真，失败返回假。
	return sendMsg(LB_SETCOLUMNWIDTH, 参数_列宽度, 0) != LB_ERR;
}
int DarkMoonUI::zyListBox::取坐标项目(int 参数_横坐标, int 参数_纵坐标) {//取指定坐标的项目索引。返回-1表示所在坐标无项目。
	int 位置 = MAKELPARAM(参数_横坐标, 参数_纵坐标);
	return LOWORD(sendMsg(LB_ITEMFROMPOINT, 0, 位置));
}